#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
URL验证器
验证特定URL是否成功加载，确保页面准备就绪后再继续执行主程序
"""

import logging
import time
from typing import Dict, Any, Optional

logger = logging.getLogger(__name__)

class UrlValidator:
    """
    URL验证器，负责验证特定页面是否正确加载
    """
    
    def __init__(self, page=None):
        """
        初始化URL验证器
        
        Args:
            page: DrissionPage页面对象
        """
        self.page = page
        self.target_url = "https://wspj.gxmu.edu.cn/new/student/student_login/index.jsp"
        self.logger = logger
    
    def set_page(self, page):
        """
        设置页面对象
        
        Args:
            page: DrissionPage页面对象
        """
        self.page = page
    def validate_url(self):
        """
        验证页面是否需要评教操作
        
        Returns:
            bool: 如果需要评教返回True，如果已全部完成返回False
        """
        try:
            if not self.page:
                self.logger.error("Page object not set")
                return False
                
            # 等待评教元素加载
            time.sleep(0.4)  # 等待400毫秒
            
            # 查找评教状态元素
            # 可能是学生评教或课程满意度评价
            evaluation_divs = self.page.eles('.box2')
            
            for div in evaluation_divs:
                # 检查是否需要评教（通过span中的数字判断）
                if self.needs_evaluation(div):
                    return True
            
            # 所有评教项都已完成
            return False
            
        except Exception as e:
            self.logger.error(f"Error validating URL: {e}")
            return False
            
    def needs_evaluation(self, element):
        """
        判断特定评教元素是否需要点击
        
        Args:
            element: 评教元素（div.box2或具有状态文本的元素）
            
        Returns:
            bool: 如果需要评教返回True，如果已全部完成返回False
        """
        try:
            # 等待400毫秒确保元素加载完成
            time.sleep(0.4)
            
            # 查找p标签中的span元素
            span = element.ele('p span')
            if not span:
                # 没有找到span元素，默认需要评教
                return True
                
            # 获取span的文本内容
            span_text = span.text.strip()
            
            # 如果span中的数字不是0，则需要点击评教
            try:
                count = int(span_text)
                return count > 0
            except ValueError:
                # 无法解析为数字，默认需要评教
                self.logger.warning(f"无法解析评教数量: {span_text}")
                return True
            
        except Exception as e:
            self.logger.error(f"Error checking evaluation need: {e}")
            return False
            
    def click_evaluation_div(self):
        """
        查找并点击需要评教的p标签元素（带有红色数字的元素）
        
        Returns:
            bool: 是否成功点击任意评教p元素
        """
        try:
            if not self.page:
                self.logger.error("Page object not set")
                return False
                
            # 等待评教元素加载
            time.sleep(0.4)  # 等待400毫秒
            
            # 查找包含红色数字的p标签
            p_elements = self.page.eles('css:p[style*="color: #666666"]')
            clicked = False
            
            for p_element in p_elements:
                # 检查是否包含红色span
                red_spans = p_element.eles('css:span[style*="color: red"]')
                if red_spans:
                    red_span = red_spans[0]
                    # 获取红色span中的文本
                    span_text = red_span.text.strip()
                    try:
                        # 检查数字是否大于0
                        count = int(span_text.replace(">", "").strip())
                        if count > 0:
                            self.logger.info(f"找到需要评教的p元素，红色数字为: {count}，准备点击")
                            # 点击p元素
                            p_element.click()
                            time.sleep(0.4)  # 等待页面响应
                            self.logger.info("成功点击评教p元素")
                            clicked = True
                            break
                    except ValueError:
                        self.logger.warning(f"无法解析评教数量: {span_text}")
            
            return clicked
            
        except Exception as e:
            self.logger.error(f"点击评教p元素时发生异常: {e}")
            return False
